# CONFIG_XEN_PRIVILEGED_GUEST is not set
# CONFIG_XEN_PHYSDEV_ACCESS is not set
CONFIG_XEN_WRITABLE_PAGETABLES=y
-# CONFIG_FOREIGN_PAGES is not set
+CONFIG_FOREIGN_PAGES=y
# CONFIG_PAGESIZED_SKBS is not set
CONFIG_X86=y
# CONFIG_X86_64 is not set
void pte_ctor(void *pte, kmem_cache_t *cache, unsigned long unused)
{
+ struct page *page = virt_to_page(pte);
+ SetPageForeign(page, pte_free);
+ set_page_count(page, 1);
clear_page(pte);
__make_page_readonly(pte);
void pte_dtor(void *pte, kmem_cache_t *cache, unsigned long unused)
{
+ struct page *page = virt_to_page(pte);
+ ClearPageForeign(page);
queue_pte_unpin(virt_to_phys(pte));
__make_page_writable(pte);
return NULL;
}
+void pte_free(struct page *pte)
+{
+ set_page_count(pte, 1);
+#ifdef CONFIG_HIGHPTE
+ if (pte < highmem_start_page)
+#endif
+ kmem_cache_free(pte_cache,
+ phys_to_virt(page_to_pseudophys(pte)));
+#ifdef CONFIG_HIGHPTE
+ else
+ __free_page(pte);
+#endif
+}
+
void pmd_ctor(void *pmd, kmem_cache_t *cache, unsigned long flags)
{
memset(pmd, 0, PTRS_PER_PMD*sizeof(pmd_t));
flush_page_update_queue();
}
-static inline void pte_free(struct page *pte)
-{
-#ifdef CONFIG_HIGHPTE
- if (pte < highmem_start_page)
-#endif
- kmem_cache_free(pte_cache,
- phys_to_virt(page_to_pseudophys(pte)));
-#ifdef CONFIG_HIGHPTE
- else
- __free_page(pte);
-#endif
-}
-
+extern void pte_free(struct page *pte);
-#define __pte_free_tlb(tlb,pte) pte_free(pte)
+#define __pte_free_tlb(tlb,pte) tlb_remove_page((tlb),(pte))
/*
* allocating and freeing a pmd is trivial: the 1-entry pmd is